package com.mk.admin.log;

import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * 该拦截器主要为线程保存请求的基本信息，例如来源ip，请求uri，请求方法等
 */
@Slf4j
@Component
public class SaveRequestBaseInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        // 将请求基本信息存到ThreadLocal,[ip,method,uri]
        String authorization = request.getHeader("openId");
        RequestBaseInfo rbi = new RequestBaseInfo(request.getRemoteAddr(), request.getMethod(), request.getRequestURI(), authorization);
        RequestContextHolder.setRequestBaseInfo(rbi);
        // 另外自己的框架里是否可以获取用户已登录的ip信息，没有的话这里还可以多设置一个获取登录用户的id
        // 因为我们的数据库日志表中有userId字段，如果没办法在后续的aop切面方法中获取，亦可以在这里拦截器中获取
        // 例如我项目中的spring security可以在aop切面中获取登录主体，拦截器就不需要获取了
        // 具体思路就是设置多一个上下文对象或者在RequestBaseInfo中设置多一个userId字段
        // 然后在这里获取请求token，然后在缓存中获取登录信息，获取登录者id
        // 当然实现的方式有多种，根据实际项目配置，或者不记录userId也可以
        // ……todo
        return true;
    }
}
